/* Analisador Lexico 
 * 
 * UFCG - DSC - Compiladores 2010.1

 * Autores:
 * 	Daniel Lucena
 * 	Danilo Queiroz
*/

%{
// INCLUDES
#include "tk.h"
#include "tkvalues.h"
#include <string.h>
extern char* yytext;
extern int col;	 // inicializado no sintatico
extern int line; // inicializado no sintatico
int yyerror(char *msg);
void updateCol();
void updateLine();
%}

coldelimi	[ \t\r]
linedelimi	[\n]
digito		[0-9]
string		\"({letra}|{digito})*\"
int		{digito}+
float		{digito}+(\.{digito}+)+(E[+-]?{digito}+)?
letra		[A-Za-z]
id		{letra}+({letra}|{digito})*
colop		"select"|"exists"|"forAll"
colopsize	"size"
relop		"<"|">"|"="|"<>"|"<="|">="
logop		"and"|"or"|"xor"|"implies"

%%

{coldelimi}+	{updateCol();}
{linedelimi}	{updateLine();}
":"		{updateCol(); return DPT;}
"."		{updateCol(); return PT;}
","		{updateCol(); return VIRGULA;}
"|"		{updateCol(); return BARRA;}
"->"		{updateCol(); return SETA;}
context		{updateCol(); return CONT;}
inv		{updateCol(); return INV;}
if		{updateCol(); return IF;}
then		{updateCol(); return THEN;}
else		{updateCol(); return ELSE;}
endif		{updateCol(); return ENDIF;}
not		{updateCol(); return NOT;}	
"-"		{updateCol(); return MINUS;}
"+"		{updateCol(); return PLUS;}
"*"		{updateCol(); return MULT;}
"/"		{updateCol(); return DIV;}
"("		{updateCol(); return APAREN;}
")"		{updateCol(); return FPAREN;}
{colop}		{updateCol(); yylval.strval = strdup(yytext); return COLOP;}
{colopsize}	{updateCol(); yylval.strval = strdup(yytext); return COLOPSIZE;}
{relop}		{updateCol(); yylval.strval = strdup(yytext); return RELOP;}
{logop}		{updateCol(); yylval.strval = strdup(yytext); return LOGOP;}
{id}		{updateCol(); yylval.strval = strdup(yytext); return ID;}
{int}		{updateCol(); yylval.strval = strdup(yytext); return INT;}
{float}		{updateCol(); yylval.strval = strdup(yytext); return FLOAT;}
{string}	{updateCol(); yylval.strval = strdup(yytext); return STRING;}
.		{char msg[25];
		 sprintf(msg,"Erro Léxico <%s>",yytext);
		 yyerror(msg);}

%%

void updateLine() {
	/* atualiza a linha atual e reseta a coluna */
	line++;
	col = 1;
}

void updateCol() {
	/* atualiza a coluna atual */
	col += yyleng;
}
